/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package es.fpsampayo.fin2006.importacionficheros;

import es.fpsampayo.fin2006.ImportarFichero;
import es.fpsampayo.recursos.Conexion;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author fran
 */
public class ImportarFicheroPad implements Runnable {
    
    private String concello;
    private int anio;
    private File file;
    private boolean salir = false;

    
    public void setAnio(int anio) {
        this.anio = anio;
    }

    public void setConcello(String concello) {
        this.concello = concello;
    }

    public void setSalir(boolean salir) {
        this.salir = salir;
    }
    
    public void setFile(File file) {
        this.file = file;
    }

    public ImportarFicheroPad(String concello, int anio, File file) {
        this.concello = concello;
        this.anio = anio;
        this.file = file;
    }
    
    private void importarPadron(File file) {

        FileReader fr = null;
        BufferedReader br = null;

        try {
            int regInsertadosBI = 0;
            int regInsertadosTI = 0;
            int regActual = 0;
            int totalCaracteres = contarRegistrosPadron(file);
            System.out.println("total caracteres: " + totalCaracteres);
            int totalReg = (totalCaracteres + 1) / 1000;
            System.out.println("total registros: " + totalReg);
            fr = new FileReader(file);
            br = new BufferedReader(fr);
            Conexion conexion = new Conexion();
            int inicio = 0;
            String sI;
            char caracter[] = new char[1000];
            br.mark(1000);
            //while (br.read(new char[1000], inicio, 1000) != -1){

            while (br.read(caracter) != -1) {
                if (salir == true){
                    break;
                }
                sI = String.valueOf(caracter);
                if (sI.contains("'")) {
                    sI = sI.replace("'", "´");
                }
                if (sI.substring(0, 2).equals("53")) {
                    conexion.insertar(parsearRegistro53(sI));
                    regInsertadosBI = regInsertadosBI + 1;
                } else if (sI.substring(0, 2).equals("54")) {
                    conexion.insertar(parsearRegistro54(sI));
                    regInsertadosTI = regInsertadosTI + 1;
                }
                inicio = inicio + 1000;
                regActual = regActual + 1;
                ImportarFichero.setTextoProgeso(regActual, totalReg);
                int progreso = (regActual * 100) / totalReg;
                ImportarFichero.setBarProgresoValue(progreso);
            }
            if (salir == false){
                JOptionPane.showMessageDialog(null, "Se han insertado:\n" + regInsertadosBI + " registros Bien Inmueble.\n"
                    + regInsertadosTI + " registros de Titulares.");
                JOptionPane.showMessageDialog(null, "Se ha terminado la operación correctamente.");
            }
            conexion.Desconectar();

        } catch (IOException ex) {
            Logger.getLogger(ImportarFicheroPad.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
    
    private int contarRegistrosPadron(File file) throws IOException {
        FileReader fr = null;
        BufferedReader br = null;
        int total_char = 0;

        try {

            fr = new FileReader(file);
            br = new BufferedReader(fr);
            total_char = br.readLine().length();

        } catch (FileNotFoundException ex) {
            Logger.getLogger(ImportarFicheroPad.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            fr.close();
        }
        return total_char;
    }
    
    private String parsearRegistro53(String s) {

        int cod_delegacion = Integer.parseInt(s.substring(2, 4));
        int cod_municipio_DGC = Integer.parseInt(s.substring(4, 7).trim());
        String clase_BI = s.substring(7, 9);
        String referencia_catastral = s.substring(9, 23);
        String cargo = s.substring(23, 27);
        String DC1 = s.substring(27, 28);
        String DC2 = s.substring(28, 29);
        String numero_fijo = s.substring(29, 37);
        String identificacion_BI = s.substring(37, 52);
        int cod_prov = Integer.parseInt(s.substring(52, 54));
        String nombre_prov = s.substring(54, 79).trim();
        int cod_municipio_DG = Integer.parseInt(s.substring(79, 82));
        int cod_municipio_INE = Integer.parseInt(s.substring(82, 85));
        String nombre_mun = s.substring(85, 125).trim();
        String nombre_EM = s.substring(125, 155).trim();
        int cod_via = Integer.parseInt(s.substring(155, 160));
        String sg_via = s.substring(160, 165).trim();
        String nombre_via = s.substring(165, 190).trim();
        String num_pol1 = s.substring(190, 194);
        if (num_pol1.equals("0000")) {
            num_pol1 = "0";
        } else {
            num_pol1 = num_pol1.replace("0", "");
        }
        String dup1 = s.substring(194, 195);
        String num_pol2 = s.substring(195, 199);
        if (num_pol2.equals("0000")) {
            num_pol2 = "0";
        } else {
            num_pol2 = num_pol2.replace("0", "");
        }
        String dup2 = s.substring(199, 200);
        String km = s.substring(200, 205);
        String bloque = s.substring(205, 209);
        String escalera = s.substring(209, 211);
        String planta = s.substring(211, 214);
        String puerta = s.substring(214, 217);
        String dir_no_estructurada = s.substring(217, 242);
        String cod_postal = s.substring(242, 247);
        String distrito = s.substring(247, 249);
        String cod_mun_origen = s.substring(249, 252);
        String zona_concentracion = s.substring(252, 254);
        String poligono = s.substring(254, 257);
        String parcela = s.substring(257, 262);
        String paraje = s.substring(262, 292);
        String anio_padron = s.substring(292, 296);
        String valor_cat = s.substring(296, 308);
        String valor_cat_suelo = s.substring(308, 320);
        String valor_cat_construccion = s.substring(320, 332);
        String base_liq = s.substring(332, 344);
        String clave = s.substring(344, 345);
        String importe_bonificacion = s.substring(345, 357);
        String clave_bonificacion = s.substring(357, 358);
        String superficie_construccion = s.substring(358, 368);
        String superficie_suelo = s.substring(368, 378);
        String coeficiente_prop = s.substring(378, 387);
        String importe_valor_base = s.substring(387, 399);
        String cod_proc = s.substring(399, 400);
        String ejercicio_efectos = s.substring(400, 404);
        String valor_cat_efectos = s.substring(404, 416);
        String ejercicio_revision = s.substring(416, 420);
        String ejercicio_revision_parcial = s.substring(420, 424);
        String periodo_reduccion = s.substring(424, 426);
        String cod_derecho_BI = s.substring(426, 428);
        String num_titlurares = s.substring(428, 432);
        String tipo_titulares = s.substring(432, 433);
        String complemento = s.substring(433, 453);
        String nif = s.substring(453, 462).trim();
        String nombre = s.substring(462, 522).trim();
        String clave_identificacion = s.substring(522, 530);

        String sql = "INSERT INTO bien_inmueble("
                + "cod_delegacion,"
                + "cod_municipio_dgc,"
                + "clase_bi,"
                + "referencia_catastral,"
                + "cargo,"
                + "dc1,"
                + "dc2,"
                + "numero_fijo,"
                + "identificacion_bi,"
                + "cod_prov,"
                + "nombre_prov,"
                + "cod_municipio_dg,"
                + "cod_municipio_ine,"
                + "nombre_municipio,"
                + "nombre_em,"
                + "cod_via,"
                + "sg_via,"
                + "nombre_via,"
                + "num_pol1,"
                + "dup1,"
                + "num_pol2,"
                + "dup2,"
                + "km,"
                + "bloque,"
                + "escalera,"
                + "planta,"
                + "puerta,"
                + "dir_no_estructurada,"
                + "cod_postal,"
                + "distrito,"
                + "cod_mun_origen, "
                + "zona_concentracion,"
                + "poligono,"
                + "parcela,"
                + "paraje,"
                + "anio_padron,"
                + "valor_cat,"
                + "valor_cat_suelo,"
                + "valor_car_construccion,"
                + "base_liq,"
                + "clave,"
                + "importe_bonificacion,"
                + "clave_bonificacion,"
                + "superficie_construccion,"
                + "superficie_suelo,"
                + "coeficiente_prop,"
                + "importe_valor_base,"
                + "cod_proc,"
                + "ejercicio_efectos,"
                + "valor_cat_efectos,"
                + "ejercicio_revision,"
                + "ejercicio_revision_parcial,"
                + "periodo_reduccion,"
                + "cod_derecho_bi,"
                + "num_titulares,"
                + "tipo_titulares,"
                + "complemento,"
                + "nif,"
                + "nombre,"
                + "clave_identificacion,"
                + "concello,"
                + "anio)"
                + "VALUES ("
                + cod_delegacion + ","
                + cod_municipio_DGC + ",\'"
                + clase_BI + "\',\'"
                + referencia_catastral + "\',\'"
                + cargo + "\',\'"
                + DC1 + "\',\'"
                + DC2 + "\',\'"
                + numero_fijo + "\',\'"
                + identificacion_BI + "\',"
                + cod_prov + ",\'"
                + nombre_prov + "\',"
                + cod_municipio_DG + ","
                + cod_municipio_INE + ",\'"
                + nombre_mun + "\',\'"
                + nombre_EM + "\',"
                + cod_via + ",\'"
                + sg_via + "\',\'"
                + nombre_via + "\',\'"
                + num_pol1 + "\',\'"
                + dup1 + "\',\'"
                + num_pol2 + "\',\'"
                + dup2 + "\',\'"
                + km + "\',\'"
                + bloque + "\',\'"
                + escalera + "\',\'"
                + planta + "\',\'"
                + puerta + "\',\'"
                + dir_no_estructurada + "\',\'"
                + cod_postal + "\',\'"
                + distrito + "\',\'"
                + cod_mun_origen + "\',\'"
                + zona_concentracion + "\',\'"
                + poligono + "\',\'"
                + parcela + "\',\'"
                + paraje + "\',\'"
                + anio_padron + "\',\'"
                + valor_cat + "\',\'"
                + valor_cat_suelo + "\',\'"
                + valor_cat_construccion + "\',\'"
                + base_liq + "\',\'"
                + clave + "\',\'"
                + importe_bonificacion + "\',\'"
                + clave_bonificacion + "\',\'"
                + superficie_construccion + "\',\'"
                + superficie_suelo + "\',\'"
                + coeficiente_prop + "\',\'"
                + importe_valor_base + "\',\'"
                + cod_proc + "\',\'"
                + ejercicio_efectos + "\',\'"
                + valor_cat_efectos + "\',\'"
                + ejercicio_revision + "\',\'"
                + ejercicio_revision_parcial + "\',\'"
                + periodo_reduccion + "\',\'"
                + cod_derecho_BI + "\',\'"
                + num_titlurares + "\',\'"
                + tipo_titulares + "\',\'"
                + complemento + "\',\'"
                + nif + "\',\'"
                + nombre + "\',\'"
                + clave_identificacion + "\',\'"
                + concello + "\',"
                + anio + ")";
        return sql;
    }

    private String parsearRegistro54(String s) {


        int id_bien_inmueble = 1;
        int cod_delegacion = Integer.parseInt(s.substring(2, 4));
        int cod_municipio_DGC = Integer.parseInt(s.substring(4, 7));
        String clase_BI = s.substring(7, 9);
        String referencia_catastral = s.substring(9, 23);
        String cargo = s.substring(23, 27);
        String DC1 = s.substring(27, 28);
        String DC2 = s.substring(28, 29);
        String numero_fijo = s.substring(29, 37);
        String identificacion_BI = s.substring(37, 52);
        String cod_derecho = s.substring(52, 54);
        String porcentaje_derecho = s.substring(54, 59);
        String nif = s.substring(59, 68).trim();
        String nombre = s.substring(68, 128).trim();
        String clave_d_interna = s.substring(128, 136);
        int cod_prov = Integer.parseInt(s.substring(136, 138));
        String nombre_prov = s.substring(138, 163).trim();
        int cod_municipio = Integer.parseInt(s.substring(163, 166));
        int cod_municipio_ine = Integer.parseInt(s.substring(166, 169));
        String nombre_municipio = s.substring(169, 209).trim();
        String nombre_em = s.substring(209, 239).trim();
        int cod_via = Integer.parseInt(s.substring(239, 244));
        String sg_via = s.substring(244, 249).trim().trim();
        String nombre_via = s.substring(249, 274).trim();
        String num_pol1 = s.substring(274, 278);
        if (num_pol1.equals("0000")) {
            num_pol1 = "0";
        } else {
            num_pol1 = num_pol1.replace("0", "");
        }

        String dup1 = s.substring(278, 279);
        String num_pol2 = s.substring(279, 283);
        if (num_pol2.equals("0000")) {
            num_pol2 = "0";
        } else {
            num_pol2 = num_pol2.replace("0", "");
        }
        String dup2 = s.substring(283, 284);
        String km = s.substring(284, 289);
        String bloque = s.substring(289, 293);
        String escalera = s.substring(293, 295);
        String planta = s.substring(295, 298);
        String puerta = s.substring(298, 301);
        String dir_no_estructurada = s.substring(301, 326);
        String cod_postal = s.substring(326, 331);
        int apart_correos = Integer.parseInt(s.substring(331, 336));
        String nif_cb = s.substring(336, 345);
        String nombre_cb = s.substring(345, 405);
        String tipo_exp_alteracion_juridica = s.substring(405, 409);
        String fecha_alteracion_juridica = s.substring(409, 417);
        String anio_exp_alteracion_juridica = s.substring(417, 421);
        String ref_exp_dgc_origen = s.substring(423, 431);
        int cod_entidad_origen_dgc = Integer.parseInt(s.substring(431, 434));
        int anio_exp_ent_col = Integer.parseInt(s.substring(434, 438));
        String ref_exp_ent_col = s.substring(438, 451);
        String cod_ent_col_dgc = s.substring(451, 454);
        int anio_padron = Integer.parseInt(s.substring(454, 458));

        Conexion conexion = new Conexion();
        ResultSet rs = conexion.Select("SELECT id FROM bien_inmueble WHERE referencia_catastral = \'" + referencia_catastral + "\' AND cargo = \'" + cargo + "\';");
        try {
            while (rs.next()) {
                id_bien_inmueble = Integer.parseInt(rs.getObject("id").toString());
                System.out.println("id_bien_inmueble: " + id_bien_inmueble);
            }
        } catch (SQLException ex) {
            Logger.getLogger(ImportarFicheroPad.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            conexion.Desconectar();
        }

        String sql = "INSERT INTO titulares("
                + "id_bien_inmueble, cod_delegacion, cod_municipio_dgc, "
                + "clase_bi, referencia_catastral, cargo, dc1, dc2, numero_fijo, "
                + "identificacion_bi, cod_derecho, porcentaje_derecho, nif, nombre, "
                + "clave_id_interna, cod_prov, nombre_prov, cod_municipio_dg, cod_municipio_ine, "
                + "nombre_municipio, nombre_em, cod_via, sg_via, nombre_via, num_pol1, "
                + "dup1, num_pol2, dup2, km, bloque, escalera, planta, puerta, dir_no_estructurada, "
                + "cod_postal, apart_correos, nif_cb, nombre_cb, tipo_exp_alteracion_juridica, "
                + "fecha_alteracion_juridica, anio_exp_alteracion_juridica, ref_exp_dgc_origen, "
                + "cod_entidad_origen_dgc, anio_exp_ent_col, ref_exp_ent_col, cod_ent_col_dgc, "
                + "anio_padron, concello, anio) "
                + "VALUES ("
                + id_bien_inmueble + ","
                + cod_delegacion + ","
                + cod_municipio_DGC + ",\'"
                + clase_BI + "\',\'"
                + referencia_catastral + "\',\'"
                + cargo + "\',\'"
                + DC1 + "\',\'"
                + DC2 + "\',\'"
                + numero_fijo + "\',\'"
                + identificacion_BI + "\',\'"
                + cod_derecho + "\',\'"
                + porcentaje_derecho + "\',\'"
                + nif + "\',\'"
                + nombre + "\',\'"
                + clave_d_interna + "\',"
                + cod_prov + ",\'"
                + nombre_prov + "\',"
                + cod_municipio + ","
                + cod_municipio_ine + ",\'"
                + nombre_municipio + "\',\'"
                + nombre_em + "\',"
                + cod_via + ",\'"
                + sg_via + "\',\'"
                + nombre_via + "\',\'"
                + num_pol1 + "\',\'"
                + dup1 + "\',\'"
                + num_pol2 + "\',\'"
                + dup2 + "\',\'"
                + km + "\',\'"
                + bloque + "\',\'"
                + escalera + "\',\'"
                + planta + "\',\'"
                + puerta + "\',\'"
                + dir_no_estructurada + "\',\'"
                + cod_postal + "\',"
                + apart_correos + ",\'"
                + nif_cb + "\',\'"
                + nombre_cb + "\',\'"
                + tipo_exp_alteracion_juridica + "\',\'"
                + fecha_alteracion_juridica + "\',\'"
                + anio_exp_alteracion_juridica + "\',\'"
                + ref_exp_dgc_origen + "\',"
                + cod_entidad_origen_dgc + ","
                + anio_exp_ent_col + ",\'"
                + ref_exp_ent_col + "\',\'"
                + cod_ent_col_dgc + "\',"
                + anio_padron + ",\'"
                + concello + "\',"
                + anio + ")";

        System.out.println(sql);

        return sql;
    }

    @Override
    public void run() {
        while (salir == false){
            importarPadron(file);
        }
    }
}
